草庐IT

C++ 和迭代器失效

全部标签

c++ - 关于 C++ 中的迭代器

我从“更有效的C++”中阅读了一些内容,第18项:Inbrief,theiteratoritisanobject,notapointer,sothereisnoguaranteethat“->”canbeappliedtoit.†TheSTLdoesrequirethat“.”and“*”bevalidforiterators,however,so(*it).second,thoughsyntacticallyclumsy,isguaranteedtowork.)通常,我在迭代器上使用->,没有任何问题。谁能举个例子或解释一下? 最佳答案

c++ - 获取 std::min_element 和 std::max_element 以将迭代器返回到最后一个值?

当使用std::min_element和std::max_element时,如果范围内有多个元素是最低/最高,则返回的迭代器指向第一个这样的元素。但是我需要它指向最后一个这样的元素。在不编写自己的函数或反转输入数据结构的情况下,我该怎么做?我的输入数据结构是一个C风格的数组,例如intdata[N]并且C++11或Boost不可用(不是我的选择..) 最佳答案 你不必自己写数据结构,你可以使用std::reverse_iterator:typedefstd::reverse_iteratorRev;std::size_tidx=Re

结构编译器错误 vector 的 C++ 迭代器

我创建了一个包含两个变量的struct类型。我在vector中使用此数据类型,它再次存储在map中,如下所示:structA{intx;Yy;A(){};A(int_x,Y_y){x=_x,y=_y;};};typedefstd::vectorLA;typedefstd::mapMB;MBb;当我尝试使用迭代器时,例如std::vector::iteratorit=b[x].begin();编译器报错:error:noviableconversionfrom'__wrap_iter'to'__wrap_iter>*>'std::vector::iteratorit=b[x].begin

c++ - 为什么以这种方式使用迭代器有效?

这是一个最小的代码,用于重新创建让我怀疑的条件:#include#includeintmain(){std::mapmm;mm.emplace("Hi","asd");mm.emplace("Hey","asd");mm.emplace("Hello","asd");std::map::const_iteratorit=mm.find("Hey");it->second.size();//A//it->second.replace(0,1,"h");//Bautou=it->second;u.replace(0,1,"h");}为什么在A情况下将常量作为参数传递会出错,但在B情况下却有

c++ - 为什么我的 Boost.Regex 搜索只报告一次匹配迭代?

我试图找出一个字符串中有多少个正则表达式匹配项。我正在使用迭代器来迭代匹配项,并使用整数来记录有多少匹配项。longintbefore=GetTickCount();stringtext;boost::regexre("^(\\d{5})\\s(\\d{8})\\s(.*)\\s(.*)\\s(.*)\\s(\\d{8})\\s(.{1})$");char*buffer;longlength;longcount;ifstreamf;f.open("c:\\temp\\test.txt",ios::in|ios::ate);length=f.tellg();f.seekg(0,ios::

c++ - Ruby C++ 风格的迭代器

我想遍历不同的ruby​​数组(可能还有散列)。我真的不想维护一个索引来跟踪我在每个数组中的位置。不是因为我懒,而是我习惯了C++的迭代器使用方式,我认为这种方式更不容易出错。那么有没有办法在ruby​​中获取迭代器,就像我们在c++中所做的那样(这个例子并没有做太多,但它只是为了例子):std::set::iteratoriter1=set1.begin();std::set::iteratoriter2=set2.begin();while(iter1!=set1.end()&&iter2!=set2.end(){if(iter1->timestamp>iter2->timesta

c++ - 为什么从 map 中删除操作不会使迭代器无效

我想知道为什么根据谓词从循环内的映射进行删除操作会使迭代器处于有效状态,但对于vector则不然 最佳答案 Vector::erase使第一个被删除元素之后的所有元素的迭代器无效。这是有道理的,因为vector将其数据存储在数组中。当一个元素被删除时,它之后的所有元素都需要一起移动,例如inttest[]={0,1,2,3,4,5};^在上面我们有一个指向值5的迭代器,这是我们想要的,但是,元素1被删除了,我们现在有:0,2,3,4,5^迭代器指向数组末尾,这是一个问题。使用std::map,数据存储在二叉树中,所以当一个元素被删除

c++ - vector 迭代器不兼容

我目前正在为C++开发图形库,但现在遇到了一个问题,即在运行时的Debug模式下出现断言错误。我还在SO上查看了其他一些问题,但没有一个问题和答案能让我找到解决方案。在一些论坛上阅读后,我的印象是发生此错误是因为一旦vector内容更改,迭代器就会变得无效。(例如当使用erase()时)但是正如您在我的代码中看到的那样,我没有修改vector,只是迭代。错误在我用//ASSERTION标记的行中。奇怪的是,neighbor_it没有指向(*vertex_it)->neighbors()中的第一个对象,而是指向0xfeeefeee。通过代码调试时,我可以清楚地看到neighbors-ve

c++ - 比较 C++ STL 列表迭代器

我的应用程序中有一个C++STL对象列表,它是在启动时构建的,此后从未更改过;指向同一列表节点的两个独立迭代器是否总是比较相等? 最佳答案 是的。前向迭代器的要求之一是:C++1122.4.5/6:Ifaandbarebothdereferenceable,thena==bifandonlyif*aand*bareboundtothesameobject.标准容器上的所有迭代器(至少)是前向迭代器。 关于c++-比较C++STL列表迭代器,我们在StackOverflow上找到一个类似的

c++ - vector 迭代循环抛出错误?

for(std::vector::iteratorit=v.begin();it!=v.end();++it)error:conversionfrom'std::vector::const_iterator{aka__gnu_cxx::__normal_iterator>}'tonon-scalartype'std::vector::iterator{aka__gnu_cxx::__normal_iterator>}'requested这是怎么回事? 最佳答案 您处于v为const的上下文中。请改用const_iterator。fo